/**************************************************************************//**
 * @item     CosyOS-II Kernel
 * @file     os_redef.h
 * @brief    系统重定义
 * @details  基于 os_def.h、os_base.h、syscfg.h、mcucfg_x.h、port_x.h 等文件
             中的定义而再次定义，包括宏定义和类型定义。
 * @author   迟凯峰
 * @version  V3.4.0
 * @date     2025.01.06
 ******************************************************************************/

#ifndef __OS_REDEF_H
#define __OS_REDEF_H

/*------------------------------------------------------------------------------
 * SYSAPI */

#define sDefStr(s)              sDefStr_0(s)
#define sDefStr_0(s)            #s

#define sCat2Str(s1, s2)        sCat2Str_0(s1, s2)
#define sCat2Str_0(s1, s2)      s1##s2

#define sCat3Str(s1, s2, s3)    sCat3Str_0(s1, s2, s3)
#define sCat3Str_0(s1, s2, s3)  s1##s2##s3

#define sDefBitField(v)         sDefBitField_0(v)
#define sDefBitField_0(v)       volatile s_u8_t v:1

#define sDefVoidBits(n)         sDefVoidBits_0(n)
#define sDefVoidBits_0(n)       volatile s_u8_t  :n

/*------------------------------------------------------------------------------
 * INCLUDE */

#include <stdlib.h>
#include "..\Config\syscfg.h"
#include SYSCFG_STANDARDHEAD
#include sDefStr(sCat2Str(..\Port\port_, SYSCFG_MCUCORE.h))

/*------------------------------------------------------------------------------
 * NOPxX */

#define OS_NOPx1  MCUCFG_NOP
#define OS_NOPx2  OS_NOPx1; OS_NOPx1
#define OS_NOPx3  OS_NOPx2; OS_NOPx1
#define OS_NOPx4  OS_NOPx3; OS_NOPx1
#define OS_NOPx5  OS_NOPx4; OS_NOPx1
#define OS_NOPx6  OS_NOPx5; OS_NOPx1
#define OS_NOPx7  OS_NOPx6; OS_NOPx1
#define OS_NOPx8  OS_NOPx7; OS_NOPx1

/*------------------------------------------------------------------------------
 * TOTAL */

#if SYSCFG_DEBUGGING == 0
#define OS_TASKTOTAL      (SYSCFG_USERTASKTOTAL + 2) /*!< 任务总数 */
#define OS_TIMINTTOTAL     SYSCFG_USERTIMINTTOTAL    /*!< 定时中断总数 */
#define OS_TIMQRYTOTAL     SYSCFG_USERTIMQRYTOTAL    /*!< 定时查询总数 */
#else
#define OS_TASKTOTAL      (SYSCFG_USERTASKTOTAL + 4)
#define OS_TIMINTTOTAL    (SYSCFG_USERTIMINTTOTAL + 1)
#define OS_TIMQRYTOTAL    (SYSCFG_USERTIMQRYTOTAL + 2)

/*------------------------------------------------------------------------------
 * TMID（定时器ID）*/

#define OS_TMID_DEBUGGER   SYSCFG_USERTIMINTTOTAL    /*!< TMID of Debugger */
#define OS_TMID_DEBUGHOOK  SYSCFG_USERTIMQRYTOTAL    /*!< TMID of debug_hook */
/** TMID of Taskmgr */
#if OS_TIMQRYTOTAL == 2
#define OS_TMID_TASKMGR    1
#elif OS_TIMQRYTOTAL == 3
#define OS_TMID_TASKMGR    2
#elif OS_TIMQRYTOTAL == 4
#define OS_TMID_TASKMGR    3
#elif OS_TIMQRYTOTAL == 5
#define OS_TMID_TASKMGR    4
#elif OS_TIMQRYTOTAL == 6
#define OS_TMID_TASKMGR    5
#elif OS_TIMQRYTOTAL == 7
#define OS_TMID_TASKMGR    6
#elif OS_TIMQRYTOTAL == 8
#define OS_TMID_TASKMGR    7
#elif OS_TIMQRYTOTAL == 9
#define OS_TMID_TASKMGR    8
#elif OS_TIMQRYTOTAL == 10
#define OS_TMID_TASKMGR    9
#elif OS_TIMQRYTOTAL == 11
#define OS_TMID_TASKMGR   10
#elif OS_TIMQRYTOTAL == 12
#define OS_TMID_TASKMGR   11
#elif OS_TIMQRYTOTAL == 13
#define OS_TMID_TASKMGR   12
#elif OS_TIMQRYTOTAL == 14
#define OS_TMID_TASKMGR   13
#elif OS_TIMQRYTOTAL == 15
#define OS_TMID_TASKMGR   14
#elif OS_TIMQRYTOTAL == 16
#define OS_TMID_TASKMGR   15
#elif OS_TIMQRYTOTAL == 17
#define OS_TMID_TASKMGR   16
#elif OS_TIMQRYTOTAL == 18
#define OS_TMID_TASKMGR   17
#elif OS_TIMQRYTOTAL == 19
#define OS_TMID_TASKMGR   18
#elif OS_TIMQRYTOTAL == 20
#define OS_TMID_TASKMGR   19
#elif OS_TIMQRYTOTAL == 21
#define OS_TMID_TASKMGR   20
#elif OS_TIMQRYTOTAL == 22
#define OS_TMID_TASKMGR   21
#elif OS_TIMQRYTOTAL == 23
#define OS_TMID_TASKMGR   22
#elif OS_TIMQRYTOTAL == 24
#define OS_TMID_TASKMGR   23
#elif OS_TIMQRYTOTAL == 25
#define OS_TMID_TASKMGR   24
#elif OS_TIMQRYTOTAL == 26
#define OS_TMID_TASKMGR   25
#elif OS_TIMQRYTOTAL == 27
#define OS_TMID_TASKMGR   26
#elif OS_TIMQRYTOTAL == 28
#define OS_TMID_TASKMGR   27
#elif OS_TIMQRYTOTAL == 29
#define OS_TMID_TASKMGR   28
#elif OS_TIMQRYTOTAL == 30
#define OS_TMID_TASKMGR   29
#elif OS_TIMQRYTOTAL == 31
#define OS_TMID_TASKMGR   30
#elif OS_TIMQRYTOTAL == 32
#define OS_TMID_TASKMGR   31
#elif OS_TIMQRYTOTAL == 33
#define OS_TMID_TASKMGR   32
#elif OS_TIMQRYTOTAL == 34
#define OS_TMID_TASKMGR   33
#elif OS_TIMQRYTOTAL == 35
#define OS_TMID_TASKMGR   34
#elif OS_TIMQRYTOTAL == 36
#define OS_TMID_TASKMGR   35
#elif OS_TIMQRYTOTAL == 37
#define OS_TMID_TASKMGR   36
#elif OS_TIMQRYTOTAL == 38
#define OS_TMID_TASKMGR   37
#elif OS_TIMQRYTOTAL == 39
#define OS_TMID_TASKMGR   38
#elif OS_TIMQRYTOTAL == 40
#define OS_TMID_TASKMGR   39
#elif OS_TIMQRYTOTAL == 41
#define OS_TMID_TASKMGR   40
#elif OS_TIMQRYTOTAL == 42
#define OS_TMID_TASKMGR   41
#elif OS_TIMQRYTOTAL == 43
#define OS_TMID_TASKMGR   42
#elif OS_TIMQRYTOTAL == 44
#define OS_TMID_TASKMGR   43
#elif OS_TIMQRYTOTAL == 45
#define OS_TMID_TASKMGR   44
#elif OS_TIMQRYTOTAL == 46
#define OS_TMID_TASKMGR   45
#elif OS_TIMQRYTOTAL == 47
#define OS_TMID_TASKMGR   46
#elif OS_TIMQRYTOTAL == 48
#define OS_TMID_TASKMGR   47
#elif OS_TIMQRYTOTAL == 49
#define OS_TMID_TASKMGR   48
#elif OS_TIMQRYTOTAL == 50
#define OS_TMID_TASKMGR   49
#elif OS_TIMQRYTOTAL == 51
#define OS_TMID_TASKMGR   50
#elif OS_TIMQRYTOTAL == 52
#define OS_TMID_TASKMGR   51
#elif OS_TIMQRYTOTAL == 53
#define OS_TMID_TASKMGR   52
#elif OS_TIMQRYTOTAL == 54
#define OS_TMID_TASKMGR   53
#elif OS_TIMQRYTOTAL == 55
#define OS_TMID_TASKMGR   54
#elif OS_TIMQRYTOTAL == 56
#define OS_TMID_TASKMGR   55
#elif OS_TIMQRYTOTAL == 57
#define OS_TMID_TASKMGR   56
#elif OS_TIMQRYTOTAL == 58
#define OS_TMID_TASKMGR   57
#elif OS_TIMQRYTOTAL == 59
#define OS_TMID_TASKMGR   58
#elif OS_TIMQRYTOTAL == 60
#define OS_TMID_TASKMGR   59
#elif OS_TIMQRYTOTAL == 61
#define OS_TMID_TASKMGR   60
#elif OS_TIMQRYTOTAL == 62
#define OS_TMID_TASKMGR   61
#elif OS_TIMQRYTOTAL == 63
#define OS_TMID_TASKMGR   62
#elif OS_TIMQRYTOTAL == 64
#define OS_TMID_TASKMGR   63
#elif OS_TIMQRYTOTAL == 65
#define OS_TMID_TASKMGR   64
#elif OS_TIMQRYTOTAL == 66
#define OS_TMID_TASKMGR   65
#endif
#endif

/*------------------------------------------------------------------------------
 * Time Sharing（时间片）*/

#if SYSCFG_TIMESHARINGMODE == 0
#define OS_TIMESHARING(htask) SYSCFG_GLOBALTIMESHARING
#define OS_TIMESHARING_MAX    SYSCFG_GLOBALTIMESHARING
#define OS_TIMESHARING_MIN    SYSCFG_GLOBALTIMESHARING
#elif SYSCFG_TIMESHARINGMODE == 1
#define OS_TIMESHARING(htask) SYSCFG_ALGORITHMTIMESHARING(htask->pri)
#define OS_TIMESHARING_MAX    SYSCFG_ALGORITHMTIMESHARING(0)
#define OS_TIMESHARING_MIN    SYSCFG_ALGORITHMTIMESHARING(SYSCFG_TASKPRIORITY - 1)
#elif SYSCFG_TIMESHARINGMODE == 2
#define OS_TIMESHARING(htask) s_time_sharing[htask->pri]
#define OS_TIMESHARING_MAX    SYSCFG_TIMESHARING_MAX
#define OS_TIMESHARING_MIN    1
#endif
#if OS_TIMESHARING_MIN == 0 || OS_TIMESHARING_MAX > 65535
#error 时间片定义非法！
#endif

/*------------------------------------------------------------------------------
 * Taskmgr - LEN */

#if OS_TASKTOTAL <= 999
#define OS_TASKMGR_LEN_TID  6
#elif OS_TASKTOTAL <= 9999
#define OS_TASKMGR_LEN_TID  7
#elif OS_TASKTOTAL <= 99999
#define OS_TASKMGR_LEN_TID  8
#elif OS_TASKTOTAL <= 999999
#define OS_TASKMGR_LEN_TID  9
#endif

#if MCUCFG_ISA == __ARM__
#define OS_TASKMGR_LEN_RAM  15
#else
#define OS_TASKMGR_LEN_RAM  13
#endif

#define OS_TASKMGR_LEN_LINE \
( \
	  SYSCFG_TASKNAMELEN_MAX \
	+ OS_TASKMGR_LEN_TID + OS_TASKMGR_LEN_PRI + OS_TASKMGR_LEN_STA \
	+ OS_TASKMGR_LEN_CPU + OS_TASKMGR_LEN_RAM \
)

/*------------------------------------------------------------------------------
 * DEBUGBUFF - SIZE */

#define OS_DEBUGRECVBUFFSIZE    (SYSCFG_TASKNAMELEN_MAX + 64) /*!< size of DEBUG 接收缓存 */
#define OS_CMDLINESENDBUFFSIZE  (SYSCFG_TASKNAMELEN_MAX + 64) /*!< size of 命令行 发送缓存 */
#define OS_TASKMGRSENDBUFFSIZE \
( \
	(OS_TASKMGR_LEN_LINE + 2) * (OS_TASKTOTAL + 7 + SYSCFG_RTC_SHOW) + 2 * 2 + 1 \
) /*!< size of Taskmgr 发送缓存 */

/*------------------------------------------------------------------------------
 * typedef base */

typedef s_u8_t s_ecode_t; /*!< 错误码类型 */

#if OS_TASKTOTAL + 1 < 256
typedef s_u8_t  s_tid_t;  /*!< 任务ID类型 */
#elif OS_TASKTOTAL + 1 < 65536
typedef s_u16_t s_tid_t;
#elif OS_TASKTOTAL + 1 < 4294967296
typedef s_u32_t s_tid_t;
#else
typedef s_u64_t s_tid_t;
#endif

#if OS_TIMESHARING_MAX < 256
typedef s_u8_t  s_sharing_t; /*!< 时间片类型 */
#elif OS_TIMESHARING_MAX < 65536
typedef s_u16_t s_sharing_t;
#else
#error 时间片溢出！
#endif

typedef sCat3Str(s_u, SYSCFG_DELAYBITS, _t)     s_delay_t;   /*!< 延时定时器类型 */
typedef sCat3Str(s_u, SYSCFG_TIMINTBITS, _t)    s_timint_t;  /*!< 定时中断定时器类型 */
typedef sCat3Str(s_u, SYSCFG_TIMQRYBITS, _t)    s_timqry_t;  /*!< 定时查询定时器类型 */
typedef sCat3Str(s_u, SYSCFG_SEMAPHOREBITS, _t) s_semsize_t; /*!< 计数信号量类型 */

/*------------------------------------------------------------------------------
 * typedef function and function pointer */

typedef bool s_boolvoid_tf(void); /*!< Keil C51 专用 */
typedef bool (_CODE_MEM_ *s_boolvoid_tfp)(void);
typedef void (_CODE_MEM_ *s_voidvoid_tfp)(void);

/*------------------------------------------------------------------------------
 * typedef struct */

/**
 \brief      运行时间
 */
typedef struct
{
	s_u16_t day;   /*!< 天 */
	s_u8_t hour;   /*!< 时 */
	s_u8_t minute; /*!< 分 */
	s_u8_t second; /*!< 秒 */
}s_runtime_ts;

/**
 \brief      软件RTC
 */
typedef struct
{
	s_u8_t yeah;   /*!< 年高八位 */
	s_u8_t year;   /*!< 年低八位 */
	s_u8_t month;  /*!< 月 */
	s_u8_t date;   /*!< 日 */
	s_u8_t hour;   /*!< 时 [24时制] */
	s_u8_t minute; /*!< 分 */
	s_u8_t second; /*!< 秒 */
	s_u8_t day;    /*!< 周 [1：周一，7：周日] */
}s_rtc_ts;

/**
 \brief      软件RTC-每信号
 \details    典型的应用示例参见 tick_hook。
 */
typedef struct
{
	sDefBitField(year);    /*!< 每年 */
	sDefBitField(month);   /*!< 每月 */
	sDefBitField(day);     /*!< 每日 */
	sDefBitField(hour);    /*!< 每时 */
	sDefBitField(minute);  /*!< 每分 */
	sDefBitField(second);  /*!< 每秒 */
	sDefBitField(halfsec); /*!< 每半秒 */
	sDefBitField(set);     /*!< 设置时间 */
}s_every_ts;

/**
 \brief      系统警告
 */
typedef struct
{
	sDefBitField(overflow_msgqueue);         /*!<【omq】：消息队列溢出 ....... */
	sDefBitField(overflow_taskqueue);        /*!<【otq】：任务队列溢出 ....... */
	sDefBitField(timedout_saferuntime);      /*!<【osr】：安全运行时超时 ..... */
	sDefBitField(outrange_taskpriority);     /*!<【otp】：任务优先级超出范围 . */
	sDefBitField(realloc_taskstack);         /*!<【rts】：任务栈重分配发生 ... */
	sDefBitField(overflow_taskstack_future); /*!<【ots】：未来的任务栈溢出 ... */
	sDefVoidBits(2);
}s_alarm_ts;

/**
 \brief      系统异常
 */
typedef struct
{
	sDefBitField(mallocfailed_msgnode);      /*!<【mmn】：消息节点内存分配失败 */
	sDefBitField(mallocfailed_tasknode);     /*!<【mtn】：任务节点内存分配失败 */
	sDefBitField(mallocfailed_taskstack);    /*!<【mts】：任务栈内存分配失败 . */
	sDefBitField(reallocfailed_taskstack);   /*!<【rts】：任务栈内存重分配失败 */
	sDefBitField(overflow_taskstack);        /*!<【ots】：任务栈溢出 ......... */
	sDefBitField(failed_startuptask);        /*!<【fst】：启动任务失败 ....... */
	sDefBitField(error_recvmsg_int);         /*!<【erm】：中断中接收消息错误 . */
	sDefBitField(overflow_pendsvfifo);       /*!<【opd】：PendSV_FIFO溢出 .... */
}s_fault_ts;

/**
 \brief      任务节点（控制块）
 \details    CosyOS 的 任务节点 即 任务控制块，包含了任务所需的全部关键信息。
             任务静态创建时，任务节点为静态；任务动态创建时，任务节点为动态。
 */
typedef struct s_tasknode_ts
{
	mTaskNode_Head_ /*!< MSP：stacklen，PSP：psp，MSP+PSP：psp */
	                                       s_tid_t tid;          /*!< 任务ID */
	                                        s_u8_t opri;         /*!< 任务创建时的优先级 */
	                                 m_stacksize_t stacksize;    /*!< 任务栈size */
	struct s_tasknode_ts _OBJ_MEM_ * _STATIC_MEM_ *dualhandle;   /*!< 任务二重句柄：指向任务句柄的指针 */
	                                s_voidvoid_tfp entry;        /*!< 任务函数入口指针 */
	#if SYSCFG_DEBUGGING == __ENABLED__
	                       const char _CONST_MEM_ *name;         /*!< 任务名称（字符串）*/
	#endif
	#if SYSCFG_SAFERUNTIME == __ENABLED__
	                                       s_u16_t saferuntime;  /*!< 安全运行时设定值 */
	#endif
	                             s_u8_t _OBJ_MEM_ *bsp;          /*!< base stack pointer，任务栈的起始地址 */
	                                        s_u8_t create;       /*!< 任务创建 [0：静态创建，1：动态创建未重分配，2：动态创建已重分配] */
	                                        s_u8_t pri;          /*!< 任务当前优先级 */
	                                        s_u8_t status;       /*!< 任务状态 */
	                                        s_u8_t blocktype;    /*!< 阻塞类型 */
	                                     s_delay_t timer;        /*!< 软件定时器（延时/超时计数）*/
	                            void _STATIC_MEM_ *handle;       /*!< 内核对象句柄，仅指向静态对象 */
	#if SYSCFG_SAMEPRISCHEDULE == __TIMESHARING__
	                                   s_sharing_t tc_counter;   /*!< 滴答周期计数器 */
	#endif
	#if SYSCFG_DEBUGGING == __ENABLED__
	                                       s_u32_t usedtime[2];  /*!< CPU 使用时间计数 */
	                                 m_stacksize_t stacklen_max; /*!< 任务栈的实际占用在历史上的最大值 */
	#endif
	#if SYSCFG_SAFERUNTIME == __ENABLED__
	                                       s_u32_t srt_counter;  /*!< 安全运行时计数器 */
	#endif
	               struct s_tasknode_ts _OBJ_MEM_ *last;         /*!< 上一节点 */
	               struct s_tasknode_ts _OBJ_MEM_ *next;         /*!< 下一节点 */
	mTaskNode_Tail_ /*!< MCS51/251：mUserReg_C_，减栈：psp_top */
}s_tasknode_ts;
typedef s_tasknode_ts _OBJ_MEM_ *s_tasknode_tsp; /*!< 任务句柄 */

/**
 \brief      任务HAND（装载块）
 \details    创建任务时，用来装载任务的关键参数。
          1、当任务为动态创建时，会定义此结构体；在启动任务时，会动态的分配任务节点，
             再把任务HAND中的参数传入任务节点。
          2、当任务为静态创建时，任务节点就是任务HAND，不会再额外定义此结构体。
             注：有关结构体成员的相关说明参见任务节点。
 */
typedef struct
{
	                                         const mTaskNode_Head_
	                                       s_tid_t tid;
	                                  const s_u8_t opri;
	                           const m_stacksize_t stacksize;
	s_tasknode_ts _OBJ_MEM_ * _STATIC_MEM_ * const dualhandle;
	                                s_voidvoid_tfp entry;
	#if SYSCFG_DEBUGGING == __ENABLED__
	                const char _CONST_MEM_ * const name;
	#endif
	#if SYSCFG_SAFERUNTIME == __ENABLED__
	                                 const s_u16_t saferuntime;
	#endif
}s_taskhand_ts;
typedef s_taskhand_ts _STATIC_MEM_ *s_taskhand_tsp; /*!< 任务装载块句柄 */

/**
 \brief      定时中断HAND（控制块）
 \details    创建定时中断任务或钩子时，会定义此结构体。
 */
typedef struct
{
	             s_timint_t timer;      /*!< 定时器 */
	             s_timint_t reload;     /*!< 重装载值 */
	                   bool autoreload; /*!< 是否自动重装载定时器？*/
	             const bool hookortask; /*!< 该定时中断是钩子还是任务？[0：hook，1：task] */
	void _CODE_MEM_ * const hookorhand; /*!< 钩子函数指针或任务HAND指针 */
}s_timinthand_ts;
typedef s_timinthand_ts _STATIC_MEM_ *s_timinthand_tsp; /*!< 定时中断句柄 */

/**
 \brief      定时查询HAND（控制块）
 \details    创建定时查询任务或钩子时，会定义此结构体。
 */
typedef struct
{
	             s_timqry_t timer;      /*!< 定时器 */
	             s_timqry_t reload;     /*!< 重装载值 */
	                   bool autoreload; /*!< 是否自动重装载定时器？*/
	             const bool hookortask; /*!< 该定时查询是钩子还是任务？[0：hook，1：task] */
	void _CODE_MEM_ * const hookorhand; /*!< 钩子函数指针或任务HAND指针 */
	   s_boolvoid_tfp const event;      /*!< 定时查询事件函数指针 */
}s_timqryhand_ts;
typedef s_timqryhand_ts _STATIC_MEM_ *s_timqryhand_tsp; /*!< 定时查询句柄 */

/**
 \brief      互斥信号量控制块
 \details    创建互斥信号量时，会定义此结构体。
 */
typedef struct
{
	volatile s_u8_t mutex;
	s_tasknode_tsp htask;
	s_u8_t opri;
}s_mutex_ts;
typedef s_mutex_ts _STATIC_MEM_ *s_mutex_tsp; /*!< 互斥信号量句柄 */

/**
 \brief      二值信号量控制块
 \details    创建二值信号量时，会定义此结构体。
 */
typedef struct
{
	volatile bool binary;
	s_tasknode_tsp htask;
}s_binary_ts;
typedef s_binary_ts _STATIC_MEM_ *s_binary_tsp; /*!< 二值信号量句柄 */

/**
 \brief      计数信号量控制块
 \details    创建计数信号量时，会定义此结构体。
 */
typedef struct
{
	volatile s_semsize_t counter;
	const    s_semsize_t maximum;
	s_tasknode_tsp htask;
}s_semaph_ts;
typedef s_semaph_ts _STATIC_MEM_ *s_semaph_tsp; /*!< 计数信号量句柄 */

/**
 \brief      信箱控制块
 \details    创建信箱时，会定义此结构体。
 */
typedef struct
{
	volatile m_fetion_t fetion;
	s_tasknode_tsp htask;
}s_tionbox_ts;
typedef s_tionbox_ts _STATIC_MEM_ *s_tionbox_tsp; /*!< 信箱句柄 */

/**
 \brief      邮箱控制块
 \details    创建邮箱时，会定义此结构体。
 */
typedef struct
{
	volatile bool flag;
	void *mail;
	s_tasknode_tsp htask;
}s_mailbox_ts;
typedef s_mailbox_ts _STATIC_MEM_ *s_mailbox_tsp; /*!< 邮箱句柄 */

/**
 \brief      消息节点
 \details    动态队列之消息节点。
 */
typedef struct s_msgnode_ts
{
	void *msg;
	struct s_msgnode_ts _MALLOC_MEM_ *last;
	struct s_msgnode_ts _MALLOC_MEM_ *next;
}s_msgnode_ts;
typedef s_msgnode_ts _MALLOC_MEM_ *s_msgnode_tsp; /*!< 消息句柄 */

/**
 \brief      动态队列控制块
 \details    创建动态队列时，会定义此结构体。
 */
typedef struct
{
	           size_t counter;
	     const s_u8_t type;
	     const s_u8_t mode;
	     const size_t len;
	   s_tasknode_tsp htask;
	    volatile bool mutex;
	    s_msgnode_tsp head;
	    s_msgnode_tsp tail;
}sd_queue_ts;
typedef sd_queue_ts _STATIC_MEM_ *sd_queue_tsp; /*!< 动态队列句柄 */

/**
 \brief      静态队列控制块
 \details    创建静态队列时，会定义此结构体。
 */
typedef struct
{
	               size_t counter;
	         const s_u8_t type;
	         const s_u8_t mode;
	         const size_t len;
	       s_tasknode_tsp htask;
	        volatile bool mutex;
	void * _STATIC_MEM_ * head;
	void * _STATIC_MEM_ * tail;
	void * _STATIC_MEM_ * const base;
}ss_queue_ts;
typedef ss_queue_ts _STATIC_MEM_ *ss_queue_tsp; /*!< 静态队列句柄 */

/**
 \brief      队列控制块
 \details    创建队列时，并不会定义此结构体；访问队列时，通过其队列句柄，
             即可访问动态队列控制块，也可访问静态队列控制块。
 */
typedef struct
{
	           size_t counter; /*!< 队列计数器：记录队列中消息的数量 */
	     const s_u8_t type;    /*!< 队列类型 [0：静态队列，1：动态队列] */
	     const s_u8_t mode;    /*!< 传输模式 [0：FIFO，1：LIFO] */
	     const size_t len;     /*!< 队列长度 */
	   s_tasknode_tsp htask;   /*!< 任务句柄 */
	    volatile bool mutex;   /*!< 队列互斥量 */
}s_queue_ts;
typedef s_queue_ts _STATIC_MEM_ *s_queue_tsp; /*!< 队列句柄 */

/**
 \brief      线程内存控制块
 \details    创建线程内存池时，会定义此结构体。
 */
typedef struct
{
	void _MALLOC_MEM_ *head;
	void _MALLOC_MEM_ *move;
	size_t size;
}s_thrmem_ts;
typedef s_thrmem_ts _STATIC_MEM_ *s_thrmem_tsp; /*!< 线程内存句柄 */

/*------------------------------------------------------------------------------
 * 中断挂起服务_FIFO 结构体类型定义 */

typedef struct
{
	const s_u8_t svid;
	s_tasknode_tsp htask;
}sp_task_ts;
typedef sp_task_ts _STATIC_MEM_ *sp_task_tsp;

typedef struct
{
	const s_u8_t svid;
	s_tasknode_tsp htask;
	const s_u8_t npri;
}sp_taskpri_ts;
typedef sp_taskpri_ts _STATIC_MEM_ *sp_taskpri_tsp;

typedef struct
{
	const s_u8_t svid;
	s_tasknode_tsp htask;
	const s_delay_t tick;
}sp_blocktime_ts;
typedef sp_blocktime_ts _STATIC_MEM_ *sp_blocktime_tsp;

typedef struct
{
	const s_u8_t svid;
	const s_u8_t tmid;
	s_timint_t tick;
}sp_timint_ts;
typedef sp_timint_ts _STATIC_MEM_ *sp_timint_tsp;

typedef struct
{
	const s_u8_t svid;
	const s_u8_t tmid;
	s_timqry_t tick;
}sp_timqry_ts;
typedef sp_timqry_ts _STATIC_MEM_ *sp_timqry_tsp;

typedef struct
{
	const s_u8_t svid;
	s_binary_tsp const hbin;
	const bool value;
}sp_binary_ts;
typedef sp_binary_ts _STATIC_MEM_ *sp_binary_tsp;

typedef struct
{
	const s_u8_t svid;
	s_semaph_tsp const hsem;
}sp_semaph_ts;
typedef sp_semaph_ts _STATIC_MEM_ *sp_semaph_tsp;

typedef struct
{
	const s_u8_t svid;
	s_tionbox_tsp const htbox;
	m_fetion_t fetion;
}sp_tionbox_ts;
typedef sp_tionbox_ts _STATIC_MEM_ *sp_tionbox_tsp;

typedef struct
{
	const s_u8_t svid;
	s_mailbox_tsp const hmbox;
	void *mail;
}sp_mailbox_ts;
typedef sp_mailbox_ts _STATIC_MEM_ *sp_mailbox_tsp;

typedef struct
{
	const s_u8_t svid;
	s_queue_tsp const hque;
	void *msg;
}sp_msg_ts;
typedef sp_msg_ts _STATIC_MEM_ *sp_msg_tsp;

typedef struct
{
	const s_u8_t svid;
	void _STATIC_MEM_ * const hgrp;
	const char size;
	m_group_t value;
}sp_group_ts;
typedef sp_group_ts _STATIC_MEM_ *sp_group_tsp;

typedef struct
{
	const s_u8_t svid;
	void * const gp;
	void * const lp;
	const size_t size;
}sp_gvar_ts;
typedef sp_gvar_ts _STATIC_MEM_ *sp_gvar_tsp;

typedef struct
{
	const s_u8_t svid;
	s_voidvoid_tfp const fp;
}sp_pendsvc_ts;
typedef sp_pendsvc_ts _STATIC_MEM_ *sp_pendsvc_tsp;

typedef struct
{
	const s_u8_t svid;
	bool * const sign;
}sp_sign_ts;
typedef sp_sign_ts _STATIC_MEM_ *sp_sign_tsp;



#endif
